package service

import (
	"blog/utils"
	"encoding/csv"
	"encoding/json"
	"fmt"
	"github.com/xuri/excelize/v2"
	"os"
	"strconv"
	"strings"
)

// 学习了解go读写Excel操作 https://zhuanlan.zhihu.com/p/33417413

// HelloExcel 写入数据创建Excel文件
func HelloExcel() {
	readShenzhen()

	// 判断表头映射数据

	//ReadCsv("runtime/system_page_202404221023.csv")

	// 读取当前列表下所有文件,不包含文件夹
	//var s []string
	//s, _ = GetAllFile("runtime", s)
	//fmt.Println(s)
}

func CommonReadResult() {
	targetExcelName := "doc/shenzhen.xlsx"
	targetShellName := "Sheet1"
	f, err := excelize.OpenFile(targetExcelName)
	if err != nil {
		println(err.Error())
		return
	}
	var headList []string
	var contentList [][]string
	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows(targetShellName)
	for i, v := range rows {
		if i > 0 {
			// 读取数据到内容数组
			contentList = append(contentList, v)
		} else {
			headList = v
		}
	}
	fmt.Println("内容数组", contentList)
	fmt.Println("表头", headList)
}

// ---------------- 读取 shenzhen.xlsx 数据 -------------------------

func readShenzhen() {
	targetExcelName := "doc/shenzhen.xlsx"
	targetShellName := "Sheet1"
	f, err := excelize.OpenFile(targetExcelName)
	if err != nil {
		println(err.Error())
		return
	}
	var headList []string
	// 处理中文表头key映射
	// "公园名称":"横坑公园","公园地址":"根竹园社区","公园类别":"社区公园","区":"光明、宝安","序号":"1087"

	var resList []map[string]string

	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows(targetShellName)
	for i, v := range rows {
		itemDict := make(map[string]string)
		if i > 0 {
			// 读取数据到内容数组
			for ki, kv := range headList {
				//fmt.Println("处理ki--", ki, "v==", v[ki])
				itemDict[kv] = v[ki]
			}
		} else {
			headList = v
			// 遍历处理映射数据

			for ei, ev := range v {
				switch ev {
				case "公园名称":
					headList[ei] = "name"
					break
				case "公园地址":
					headList[ei] = "address"
					break
				case "公园类别":
					headList[ei] = "category"
					break
				case "区":
					headList[ei] = "part"
					break
				case "序号":
					headList[ei] = "id"
					break
				}
			}
		}
		if i > 0 {
			resList = append(resList, itemDict)
		}
	}

	fmt.Println(headList)

	// 遍历数据写入es
	for ci, cv := range resList {
		cvJson, _ := json.Marshal(cv)
		fmt.Println("parks", strconv.Itoa(ci+1), string(cvJson))
		utils.AddEsDataString("parks", strconv.Itoa(ci+1), string(cvJson))
	}
}

// ------------------------- 读取 csv数据 ---------------------

// ReadCsv 读取csv数据
func ReadCsv(fullFilePath string) {

	// 处理文件名信息,过滤掉目录,拿到文件名 文件名作为 mysql 表名
	filesPath := strings.Split(fullFilePath, "/")
	//fmt.Println(filesName)
	//fmt.Println(filesName[len(filesName)-1]) // 取最后一个元素

	filesName := strings.Split(filesPath[len(filesPath)-1], ".")

	fmt.Println(filesName)
	// 文件名 也就是写入MySQL的表名
	if filesName[1] != "csv" {
		fmt.Println("不是csv文件,跳过操作", filesName)
		return
	}
	fmt.Println("开始操作")

	// 打开这个 csv 文件
	file, err := os.Open(fullFilePath)
	if err != nil {
		panic(err)
	}
	defer file.Close()

	// 初始化一个 csv reader，并通过这个 reader 从 csv 文件读取数据
	reader := csv.NewReader(file)
	// 设置返回记录中每行数据期望的字段数，-1 表示返回所有字段
	reader.FieldsPerRecord = -1
	// 通过 readAll 方法返回 csv 文件中的所有内容
	record, err := reader.ReadAll()
	if err != nil {
		panic(err)
	}
	var dataContent []string
	var headerStr string
	// 遍历从 csv 文件中读取的所有内容
	for index, item := range record {
		var contentStr string
		fmt.Println("操作", index)
		if index == 0 {
			for ki, iv := range item {
				if ki == 0 {
					continue
				}
				// 第一列id不要
				if ki == len(item)-1 {
					headerStr = headerStr + "'" + iv + "'"
				} else {
					headerStr = headerStr + "'" + iv + "',"
				}
			}
		} else {
			for ki, iv := range item {
				if ki == 0 {
					continue
				}
				// 判断是否是最后一个元素,最后一个元素不加结尾的 逗号
				if ki == len(item)-1 {
					contentStr = contentStr + "'" + iv + "'"
				} else {
					contentStr = contentStr + "'" + iv + "',"
				}
			}
			dataContent = append(dataContent, contentStr)
		}
		contentStr = "" // 结束以后初始化字符串
	}
	//fmt.Println("结果数据表名", filesName[0])
	//fmt.Println("结果数据表头", headerStr)
	//fmt.Println("结果数据表数据", dataContent)
	// 组装SQL
	//sqlDemo := "INSERT INTO xzaims.system_page (id, page_code, title, `path`, component_path , `show`, icon, redirect, `level`, status , create_by, update_by, create_time, update_time, xzaims_active_page_code) VALUES (1, 'rights_config', '系统配置', '/rights_config', '' , 1, 'user-setting', '/rights_config/index', '5', 1 , 'darrenyli', 'darrenyli', '2024-03-22 10:39:13', '2024-04-16 11:15:24', '');"
	//fmt.Println(sqlDemo)
	for _, v := range dataContent {
		kk := fmt.Sprintf("INSERT INTO xzaims.system_page ( %s ) VALUES ( %s );", headerStr, v)
		fmt.Println(kk)
		fmt.Println("========================")
	}
}

// ----------------------------------------------- 查看MySQL的元数据信息 ---------------------------------------------
// SHOW CREATE TABLE linkinframe.user; 获取对应的 ddl信息
// desc xzaims.system_page ; 查看表结构信息

func ShowMYsqlTable() {
	conDb := utils.GetLocalMysql(utils.Xzaims)
	rawSql := "desc xzaims.system_page"
	rawSql = "SHOW CREATE TABLE linkinframe.user;"
	rawSql = "desc xzaims.system_page;"
	result, _ := conDb.Debug().Raw(rawSql).Rows()
	fmt.Println(result)
	//conDb.QuoteTo()
}

// ----------------------------------------------- 读取现有Excel文档 ---------------------------------------------

// ReadExcel 读取现有Excel文档
func ReadExcel() {
	f, err := excelize.OpenFile("Book1.xlsx")
	if err != nil {
		println(err.Error())
		return
	}
	// 获取工作表中指定单元格的值
	cell, err := f.GetCellValue("Sheet1", "B2")
	if err != nil {
		println(err.Error())
		return
	}
	println(cell)
	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows("Sheet1")
	for _, row := range rows {
		for _, colCell := range row {
			print(colCell, "\t")
		}
		println()
	}
}

// ReadExcelAndShow 测试读取Excel文档
func ReadExcelAndShow() {
	f, err := excelize.OpenFile("k.xlsx")
	if err != nil {
		println(err.Error())
		return
	}
	// 获取工作表中指定单元格的值
	cell, err := f.GetCellValue("anxiong", "B2")
	if err != nil {
		println(err.Error())
		return
	}
	println(cell)
	// 获取 Sheet1 上所有单元格
	rows, err := f.GetRows("anxiong")
	for _, row := range rows {
		for _, colCell := range row {
			print(colCell, "\t")
		}
		println()
	}
}

// GetAllFile 读取当前文件夹下所有的文件,不包含文件夹的
func GetAllFile(pathname string, s []string) ([]string, error) {
	//rd, err := ioutil.ReadDir(pathname)
	rd, err := os.ReadDir(pathname)
	if err != nil {
		fmt.Println("read dir fail:", err)
		return s, err
	}

	for _, fi := range rd {
		if !fi.IsDir() {
			fullName := pathname + "/" + fi.Name()
			s = append(s, fullName)
		}
	}
	return s, nil
}
